package edu.asselvi.seguros.dao;

import java.sql.Connection; 
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import edu.asselvi.seguros.db.ConnectionFactory;
import edu.asselvi.seguros.db.DbUtils;
import edu.asselvi.seguros.exception.ESegurosErros;
import edu.asselvi.seguros.exception.SegurosException;
import edu.asselvi.seguros.pojo.Fatura;

public class FaturaDao extends DbUtils {

	Connection conn = null;
	
	public FaturaDao(Connection conn) {
		this.conn = conn;
	}

	public FaturaDao() throws SegurosException {
		this.conn = new ConnectionFactory().getConnection();
	}
	
	public Fatura insert(Fatura fatura) throws SegurosException {

		String sql = "INSERT INTO FATURAS (ID_FATURA, VALOR, DATA_VENCIMENTO, FK_ID_CONTRATO, TIPOFATURA) VALUES (?,?,?,?,?)";
		PreparedStatement p = null;
		
		try {
			p = conn.prepareStatement(sql);
			fatura.setId_fatura(getNextId("SEQ_FATURAS", conn));
			int cont = 1;
			
			p.setInt(cont++, fatura.getId_fatura());
			p.setDouble(cont++, fatura.getValor());
			p.setDate(cont++, utilDatetoSQLDate(fatura.getData_vencimento())); //converte date. util - sql
			p.setInt(cont++, fatura.getFk_id_contrato());
			p.setInt(cont++, fatura.getTipoFatura());

			p.executeUpdate();

		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_INSERCAO);
		} finally {
			close(p);
		}
		
		return fatura;
	}

	public void pagamento (int id_fatura) throws SegurosException, SQLException {
		
		String sql = "UPDATE FATURAS SET DATA_PAGAMENTO = ? WHERE ID_FATURA = ?";
		PreparedStatement p = null;
		
		
		try {
			p = conn.prepareStatement(sql);

			p.setDate(1, utilDatetoSQLDate(new Date()));
			p.setInt(2, id_fatura);

			p.executeUpdate();
			conn.close();

		} finally {
			close(p);
		}
	}


	public List<Fatura> list() throws SQLException, SegurosException {
		String sql = "SELECT * FROM FATURAS";

		List<Fatura> lista = null;
		java.sql.ResultSet rs = null;
		PreparedStatement p = null;
		
		try {
			lista = new ArrayList<Fatura>();
			p = conn.prepareStatement(sql);
			rs = p.executeQuery();
			
			while (rs.next()) {
				Fatura fatura = new Fatura();
				
				fatura.setId_fatura(rs.getInt("ID_FATURA"));
				fatura.setValor(rs.getDouble("VALOR"));
				fatura.setData_processamento(rs.getDate("DATA_PROCESSAMENTO"));
				fatura.setData_vencimento(rs.getDate("DATA_VENCIMENTO"));
				fatura.setData_pagamento(rs.getDate("DATA_PAGAMENTO"));
				fatura.setFk_id_contrato(rs.getInt("FK_ID_CONTRATO"));
				fatura.setTipoFatura(rs.getInt("TIPOFATURA"));
				
				lista.add(fatura);
			}
			
			if (lista.isEmpty()){
				throw new SegurosException(ESegurosErros.ERRO_ZERO_REGISTROS);
			} 
			
			
		} finally {
			close(p);
			close(rs);
		}

		return lista;

	}

	public List<Fatura> faturasByContrato(int id_contrato) throws SQLException, SegurosException {
		
		String sql = "SELECT * FROM FATURAS where FK_ID_CONTRATO = ?";
		
		List<Fatura> lista = null;
		java.sql.ResultSet rs = null;
		PreparedStatement p = null;
		
		
		try {
			lista = new ArrayList<Fatura>();
			p = conn.prepareStatement(sql);
			p.setInt(1, id_contrato);
			rs = p.executeQuery();
			
			while (rs.next()) {
				Fatura fatura = new Fatura();
				
				fatura.setId_fatura(rs.getInt("ID_FATURA"));
				fatura.setValor(rs.getDouble("VALOR"));
				fatura.setData_processamento(rs.getDate("DATA_PROCESSAMENTO"));
				fatura.setData_vencimento(rs.getDate("DATA_VENCIMENTO"));
				fatura.setData_pagamento(rs.getDate("DATA_PAGAMENTO"));
				fatura.setFk_id_contrato(rs.getInt("FK_ID_CONTRATO"));
				fatura.setTipoFatura(rs.getInt("TIPOFATURA"));
				
				lista.add(fatura);
			}
			
			if (lista.isEmpty()){
				throw new SegurosException(ESegurosErros.ERRO_ZERO_REGISTROS);
			} 
			
			
		} finally {
			close(p);
			close(rs);
		}
		
		return lista;
		
	}
}
